#include <stdio.h>
int opcion_while ();                            //declaro las funciones que utiliza el programa
int opcion_do ();
int opcion_for ();
int ciclo_while (int jurados, int *max, int *min, int *suma);
int ciclo_do (int jurados, int *max, int *min, int *suma);
int ciclo_for (int jurados, int *max, int *min, int *suma);
int impri_res (int jurados, int max, int min, int suma);

/*en todo el codigo utilizo \n antes y despues de los mensajes imprimidos en pantalla por prolijidad*/
int main (){
    char opcion;
    printf ("Bienvenido a la calculadora de puntaje promedio para competiciones.\n\nElija una opcion:\n\n");
    do{
        printf ("\na-Ciclo While\nb-Ciclo Do-While\nc-Ciclo For\nd-Salir\n\n");
        fflush (stdin);             //limpio el buffer para no tomar valores erroneos en el ciclo del menu
        scanf ("%c",&opcion);
        fflush (stdin);
        switch (opcion){
            case 'a':
                opcion_while ();
            break;
            case 'b':
                opcion_do ();
            break;
            case 'c':
                opcion_for ();
            break;
            case 'd':
            break;
            default:
                printf ("\nError, vuelva a intentarlo\n\n");
        }
    }
    while (opcion !='d');
    return 0;
}



int opcion_while (){    //funcion para la opcion "ciclo while"
    int jurados,max,min,suma;
    printf ("\nIngrese la cantidad de jurados que habra:\n");
    scanf ("%d",&jurados);
    if (jurados<=0){    //verificacion de que no se ingreso un valor no valido
        printf("\nERROR\n");
        return 1;       //en caso del un valor no valido se imprime mensaje de error
    }
    else{
        printf ("\nIngrese las notas de los jurados una por una\nEl valor valido de las notas es de 0 a 10\n");
        scanf ("%d",&max);
        suma=max;                   //inicializo estas variables
        min=max;
        if (max>=0&&max<=10){       //verifico que el valor ingresado sea un numero valido
            ciclo_while (jurados,&max,&min,&suma);  //uso otra funcion para realizar solo el ciclo while
            impri_datos (jurados,max,min,suma);
        }
        else
            printf ("\nERROR\n");   //en caso de no ser valido lo ingresa imprimo un mensaje de error
        return 0;
    }
}


/*funcion que utilizo dentro de la funcion opcio_while*/
int ciclo_while (int jurados, int *max, int *min, int *suma){
    int i,nota;
    i=2;        //inicializo un contador para el ciclo while
    while (i<=jurados){
        scanf ("%d",&nota);     //tomo un nuevo valor y compruebo que sea valido
        if (nota>=0&&nota<=10){
            *suma=*suma+nota;   //incremento la variable que suma todos las notas
            if (nota>*max){     //si el nuevo valor es mayor al anterior lo guardo en max
                *max=nota;
            }
            if (*min>nota){     //si es menor lo guardo en min
                *min=nota;
            }
        }
        else{
            printf ("\nERROR\n"); //si el valor no era valido imprimo mensaje de error
            return 1;
        }
        i++;        //incremento el contador
    }
    return 0;
}



int opcion_do(){        //funcion para la opcion "ciclo do-while", es similar a la anterior
    int jurados,max,min,suma;
    printf ("\nIngrese la cantidad de jurados que habra:\n");
    scanf ("%d",&jurados);
    if (jurados<=0){
        printf("\nERROR\n");
        return 1;
    }
    else{
        printf ("\nIngrese las notas de los jurados una por una\nEl valor valido de las notas es de 0 a 10\n");
        scanf ("%d",&max);
        suma=max;
        min=max;
        if (max>=0&&max<=10){
            ciclo_do (jurados,&max,&min,&suma); //funcion que incluye solo el ciclo do-while
            impri_datos (jurados,max,min,suma);
        }
        else
            printf ("\nERROR\n");
        return 0;
    }
}



int ciclo_do (int jurados, int *max, int *min, int *suma){
    int i,nota;
    i=2;            //inicializo contador
    do{
        scanf ("%d",&nota); //bloque
        if (nota>=0&&nota<=10){
            *suma=*suma+nota;
            if (nota>*max){
                *max=nota;
            }
            if (*min>nota){
                *min=nota;
            }
        }
        else{
            printf ("\nERROR\n");
            return 1;
        }
        i++;
    }
    while (i<=jurados); //condicion
    return 0;
}



int opcion_for (){          //funcion para la opcion "ciclo for", es similar a las anteriores
    int jurados,max,min,suma;
    printf ("\nIngrese la cantidad de jurados que habra:\n");
    scanf ("%d",&jurados);
    if (jurados<=0){
        printf("\nERROR\n");
        return 1;
    }
    else{
        printf ("\nIngrese las notas de los jurados una por una\nEl valor valido de las notas es de 0 a 10\n");
        scanf ("%d",&max);
        suma=max;
        min=max;
        if (max>=0&&max<=10){
            ciclo_for (jurados,&max,&min,&suma);
            impri_datos (jurados,max,min,suma);
        }
        else
            printf ("\nERROR\n");
        return 0;
    }
}



int ciclo_for (int jurados, int *max, int *min, int *suma){ //funcion que incluye solo el ciclo for
    int i,nota;
    for (i=2;i<=jurados;i++){
                scanf ("%d",&nota);
                if (nota>=0&&nota<=10){
                    *suma=*suma+nota;
                    if (nota>*max){
                        *max=nota;
                    }
                    if (*min>nota){
                        *min=nota;
                    }
                }
                else{
                    printf ("\nERROR\n");
                    return 1;
                }
    }
    return 0;
}



int impri_datos (int jurados, int max, int min, int suma){ //funcion que imprime los datos obtenidos
    float promedio;
    if (jurados>2){ //si hay mas de 2 jueces
        suma=suma-(max+min); //a la suma total le resta el valor max y min
        promedio= (float) suma/(jurados-2); //saca el promedio de la suma y los jurados menos el max y min
        printf ("\nEl promedio es: %.2f\nLos numeros eliminados son:\nmax: %d  min: %d\n\n",promedio,max,min);
    }
    else{       //si el numero de jueces es menor a 2
        promedio= (float) suma/(jurados); //no excluyo el valor max y min de la cuenta ya que seria un 0/0
        printf ("\nEl promedio es: %.2f\nLos numeros eliminados son:\nmax: %d  min: %d\n\n",promedio,max,min);
    }
    return 0;
}
